/**
 * 
 */
package interfaz;

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Rectangle;
import java.awt.Toolkit;

import javax.swing.JDialog;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;

import excepciones.ContenidoException;
import excepciones.DataStructureException;

import resources.NTree.Vinculo;

import logica.analizador.DocumentoJerarquicoEnlazado;
import logica.common.NodoVinculo;

/**
 * @author renzo
 *
 */
public class Navegacion extends JDialog implements KeyListener,MouseListener{

	private static final long serialVersionUID = 1L;
	private JScrollPane jScrollPane = null;
	private JTextPane jTextPane = null;
	private Vector<Object> datos;
	private int altura=0;
	private Vector<Vinculo> vinculos;
	private String texto;
	private Frame owner;
	private double filaAnterior;
	private double columnaAnterior;
	private double fil;
	private double col;
	
	/**
	 * @param owner
	 */
	public Navegacion(Frame owner,Vector<Object> datos,String texto,double filaAnterior,double columnaAnterior) {
		super(owner);
		this.owner=owner;
		this.texto=texto;
		this.datos=datos;
		this.filaAnterior=filaAnterior;
		this.columnaAnterior=columnaAnterior;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setResizable(false);
		this.vinculos=new Vector<Vinculo>();
		this.colorearTexto();
		this.setSize(523,6);
		
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		
		if(filaAnterior==0)
		{
			fil=dim.getWidth();
			col=dim.getHeight();
			fil=(fil-523)/2;
			col=(col-altura)/2;
		}
		else
		{
			fil=filaAnterior+10;
			col=columnaAnterior+10;
		}
		
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setLocation((int)fil, (int)col);
		this.setContentPane(getJScrollPane());
		this.getJTextPane().setEditable(false);
		this.setVisible(true);
		this.redimensionar();
		this.addKeyListener(this);
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setViewportView(getJTextPane());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jTextPane	
	 * 	
	 * @return javax.swing.JTextPane	
	 */
	private JTextPane getJTextPane() {
		if (jTextPane == null) {
			jTextPane = new JTextPane();
			jTextPane.setEditable(false);
		}
		return jTextPane;
	}

	private void redimensionar()
	{
		try
		{
			Rectangle caretCoords;
			int cantidadRenglones=0;
			try {
				caretCoords = this.getJTextPane().modelToView(this.getJTextPane().getCaret().getDot());
				int  x = (int) caretCoords.getY();
				int lineHeight = this.getJTextPane().getFontMetrics(this.getJTextPane().getFont()).getHeight();
				cantidadRenglones=(x / lineHeight) + 1;
			} catch (BadLocationException e) {
			}
			altura=28+((cantidadRenglones+1)*17);
			this.setSize(523,altura);
		} catch (NullPointerException e) {
		}
	}
	
	private void colorearTexto()
	{
//		creamos la clase StyleContext en la que nos apoyaremos
		StyleContext sc = new StyleContext();

//		primer tipo de estilo... color rojo
		Style estiloAzul = sc.addStyle(null, null);
		StyleConstants.setForeground(estiloAzul, Color.BLUE);
		StyleConstants.setUnderline(estiloAzul, true);
//		tambien existen los método setBackground(), setFont()

//		para el negro
		Style estiloNegro = sc.addStyle(null, null);
		StyleConstants.setForeground(estiloNegro, Color.black);
		
//		creamos el StyledDocument pasandole la clase
//		StyleContext que hemos creado antes...
		DefaultStyledDocument doc = new DefaultStyledDocument(sc);
		
		JTextPane texto1 = new JTextPane(doc); 
		texto1.setFont(new Font("Dialog", Font.BOLD, 12));
		texto1.setToolTipText("precione ESC para cerrar");
		texto1.addKeyListener(this);
		texto1.addMouseListener(this);
		this.jTextPane=texto1;
		
		try {
			for(int i=0;i<datos.size();i++)
			{
				if(datos.elementAt(i) instanceof String)
				{
					doc.insertString(doc.getLength(), (String)datos.elementAt(i), estiloNegro);
				}
				else
				{
					Vinculo v=new Vinculo();
					v.setVinculo(((NodoVinculo)datos.elementAt(i)).getVinculo().trim());
					v.setInicio(jTextPane.getText().length());
					v.setFin(jTextPane.getText().length()+((NodoVinculo)datos.elementAt(i)).getEtiqueta().length());
					this.vinculos.addElement(v);
					doc.insertString(doc.getLength(), ((NodoVinculo)datos.elementAt(i)).getEtiqueta(), estiloAzul);
				}
			}
		} catch (BadLocationException e) {
			e.printStackTrace();
		} 
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		if(arg0.getKeyCode()==27)
		{
			this.dispose();
		}
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
	}

	@SuppressWarnings("unchecked")
	@Override
	public void mouseClicked(MouseEvent arg0) {
		if(arg0.getComponent()==this.getJTextPane())
		{
			int posicion=this.getJTextPane().getCaretPosition();
			for (int i=0;i<vinculos.size();i++)
			{
				if(posicion>=vinculos.elementAt(i).getInicio() && posicion<=vinculos.elementAt(i).getFin())
				{
					DocumentoJerarquicoEnlazado dJE1;

					try {
						dJE1 = new DocumentoJerarquicoEnlazado(texto);
						datos= dJE1.getSeccion(vinculos.elementAt(i).getVinculo());
						
						Navegacion n=new Navegacion(this.owner,datos,texto,fil,col);
						
						n.setTitle(vinculos.elementAt(i).getVinculo());
						n.setModal(true);
						n.setVisible(true);
					} catch (ContenidoException e) {
						JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
					} catch (DataStructureException e) {
						JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
					}		
				}
			}
		}
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
	}
	
}  //  @jve:decl-index=0:visual-constraint="10,10"
